import { createClient, Client, Quotable, Sendable } from 'oicq'
import dotenv from 'dotenv'
import { Sender } from './handler.ts/messageHandler'

// 导入.env配置文件到环境变量
dotenv.config()

/**
 * 通用插件接口
 */
export interface IPlugin {
    /**
     * 插件名字
     */
    name: string
    /**
     * 挂载插件，传入bot实例，可以在这里监听消息，发送消息等，只会执行一遍
     */
    onMount?: (bot: QQBot) => void | Promise<void>
    /**
     * 监听消息
     */
    onMessage?: (e: Sender) => void | Promise<void>
}

/**
 * QQ机器人核心类
 */
class QQBot {
    /**
     * 管理员QQ号，一些信息会发送到这个QQ号上
     */
    public adminQQ = 0
    /**
     * Client实例
     */
    public readonly client: Client
    /**
     * 插件列表
     */
    private readonly plugins: IPlugin[] = []
    /**
     * 构造函数
     */
    constructor() {
        const botAccount = process.env.BOT_ACCOUNT
        const adminAccount = process.env.ADMIN_ACCOUNT
        if (!botAccount) {
            throw new Error('请在.env文件中配置QQ账号！')
        }
        this.client = createClient(parseInt(botAccount))
        // 配置管理员QQ号
        if (adminAccount) {
            this.adminQQ = parseInt(adminAccount)
        }
        this.listenMsg()
    }
    /**
     * 运行
     */
    public run() {
        // 登录
        this.client
            .on('system.login.qrcode', function () {
                //扫码后按回车登录
                process.stdin.once('data', () => {
                    this.login()
                })
            })
            .login()
        // 挂载插件
        this.plugins.forEach((plugin) => {
            plugin.onMount && plugin.onMount(this)
        })
    }
    /**
     * 发送消息
     */
    public sendMsg(type: 'group' | 'private', id: number, msg: Sendable, source?: Quotable) {
        if (!id) return
        if (type === 'group') {
            this.client.sendGroupMsg(id, msg, source)
        } else if (type === 'private') {
            this.client.sendPrivateMsg(id, msg, source)
        }
    }
    /**
     * 监听所有消息
     */
    public listenMsg() {
        this.client.on('message', (e) => {
            const sender = new Sender(e)
            this.plugins.forEach((plugin) => {
                plugin.onMessage && plugin.onMessage(sender)
            })
        })
    }
    /**
     * 使用插件
     */
    public usePlugin(plugin: IPlugin | IPlugin[]) {
        if (plugin instanceof Array) {
            this.plugins.push(...plugin)
            return
        }
        this.plugins.push(plugin)
    }
}

export default new QQBot()
